// Copyright (c) 2024 Go-Frame-Lite
// Go-Frame-Lite is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan
// PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
//         http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
// KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.

package gerror

import (
	"fmt"
)

// ExampleUsage 演示错误标准化模块的使用
func ExampleUsage() {
	// 1. 创建标准错误
	err1 := New(CodeInvalidParameter, "参数验证失败")
	fmt.Printf("错误1: %v\n", err1)
	fmt.Printf("错误码: %d, 错误信息: %s\n", err1.Code(), err1.Message())

	// 2. 创建带格式化的错误
	err2 := Newf(CodeDataNotFound, "用户 %s 不存在", "john")
	fmt.Printf("错误2: %v\n", err2)

	// 3. 包装现有错误
	originalErr := fmt.Errorf("数据库连接失败")
	err3 := Wrap(originalErr, CodeDBConnectionFailed, "数据库操作失败")
	fmt.Printf("错误3: %v\n", err3)
	fmt.Printf("错误详情: %s\n", err3.Detail())

	// 4. 检查错误类型
	fmt.Printf("err1是参数错误: %v\n", IsParameterError(err1.Code()))
	fmt.Printf("err2是数据错误: %v\n", IsDataError(err2.Code()))
	fmt.Printf("err3是数据库错误: %v\n", IsDBError(err3.Code()))

	// 5. 从错误中提取信息
	fmt.Printf("从err3提取错误码: %d\n", CodeFrom(err3, CodeInternalError))
	fmt.Printf("从err3提取错误信息: %s\n", MessageFrom(err3))

	// 6. 创建标准响应
	resp1 := Success(map[string]interface{}{
		"user_id": 123,
		"name":    "张三",
	})
	fmt.Printf("成功响应: %+v\n", resp1)

	resp2 := Error(CodeUnauthorized, "请先登录")
	fmt.Printf("错误响应: %+v\n", resp2)

	// 7. 从错误创建响应
	resp3 := FromError(err3, true) // 显示详细信息
	fmt.Printf("从错误创建的响应: %+v\n", resp3)
}

// ExampleGinUsage 演示Gin集成使用
func ExampleGinUsage() {
	/*
	// 在Gin路由中使用示例
	router := gin.Default()
	
	// 使用恢复中间件
	router.Use(GinRecovery(true))
	
	// 用户查询接口
	router.GET("/api/users/:id", GinHandler(func(c *GinContext) error {
		// 获取URL参数
		id, err := c.GinGetParam("id")
		if err != nil {
			return err
		}
		
		// 模拟业务逻辑
		if id == "0" {
			return New(CodeInvalidParameter, "用户ID不能为0")
		}
		
		// 模拟数据查询
		user, err := getUserByID(id)
		if err != nil {
			return Wrap(err, CodeDataNotFound, "用户不存在")
		}
		
		// 返回成功响应
		c.Success(user)
		return nil
	}, true))
	
	// 用户创建接口
	router.POST("/api/users", GinHandler(func(c *GinContext) error {
		var userReq struct {
			Name  string `json:"name" binding:"required"`
			Email string `json:"email" binding:"required,email"`
		}
		
		// 绑定并验证参数
		if err := c.GinBindAndValidate(&userReq); err != nil {
			return err
		}
		
		// 模拟创建用户
		user, err := createUser(userReq)
		if err != nil {
			return Wrap(err, CodeBusinessLogicError, "创建用户失败")
		}
		
		c.Success(user)
		return nil
	}, true))
	*/
}

// 模拟函数
type User struct {
	ID    int    `json:"id"`
	Name  string `json:"name"`
	Email string `json:"email"`
}

func getUserByID(id string) (*User, error) {
	// 模拟数据库查询
	if id == "999" {
		return nil, fmt.Errorf("数据库查询失败: 用户不存在")
	}
	return &User{ID: 123, Name: "张三", Email: "zhangsan@example.com"}, nil
}

func createUser(req interface{}) (*User, error) {
	// 模拟创建用户
	return &User{ID: 456, Name: "李四", Email: "lisi@example.com"}, nil
}